/* 异步方式监视 wait()回收子进程 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal,h>
#include <sys/types.h>
#include <sys/wait.h>

static void wait_child(int sig)
{
	/* 替子进程收尸 */
	printf("父进程回收子进程\n");
	while (waitpid(-1, NULL, WNOHANG) > 0) {
		continue;
	}
}

int main(int argc, char *argv[])
{
	struct sigaction sig = {0};
	
	/* 为SIGCHILD信号绑定处理函数 */
	sigemptyset(sig.sa_mask);
	sig.sa_handler = wait_child;
	sig_sa_flags = 0;
	if (-1 == sigaction(SIGCHLD, &sig, NULL)) {
		perror("sigaction error");
		exit(-1);
	}

	/* 创建子进程 */
	switch (fork())
	{
		case -1:
			perror("fork error");
			exit(-1);
			break;
		case 0:
			/* 子进程 */
			printf("子进程<%d>被创建\n", getpid());
			sleep(1);
			printf("子进程结束\n");
			_exit(0);
			break;
		default:
			/* 父进程 */
			break;
	}

	sleep(3);
	exit(0);
}
